package org.example.ctsbocc.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * 验证码图片生成工具类
 * 用于生成包含随机验证码的图片
 */
public class CreateVerificationCodeImage {

    // 图片宽度
    private static int WIDTH = 85;
    // 图片高度
    private static int HEIGHT = 29;
    // 字体大小
    private static int FONT_SIZE = 18;
    // 验证码字符数组
    private static char[] verifiCode;
    // 验证码图片对象
    private static BufferedImage verifiCodeImage;

    /**
     * 获取验证码图片
     * @return 生成的验证码图片
     */
    public static BufferedImage getVerifiCodeImage() {
        // 创建图片对象
        verifiCodeImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);
        // 获取图形绘制对象
        Graphics graphics = verifiCodeImage.getGraphics();

        // 生成验证码字符
        verifiCode = generateCheckCode();
        // 绘制背景
        drawBackground(graphics);
        // 绘制验证码字符
        drawRands(graphics, verifiCode);

        // 释放图形资源
        graphics.dispose();

        return verifiCodeImage;
    }

    /**
     * 获取验证码字符数组
     * @return 验证码字符数组
     */
    public static char[] getVerifiCode() {
        return verifiCode;
    }

    /**
     * 随机生成验证码字符
     * @return 4位随机验证码字符数组
     */
    private static char[] generateCheckCode() {
        // 定义验证码字符集（数字+大小写字母）
        String chars = "0123456789abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char[] rands = new char[4];
        // 随机生成4个字符
        for (int i = 0; i < 4; i++) {
            int rand = (int) (Math.random() * (10 + 26 * 2));
            rands[i] = chars.charAt(rand);
        }
        return rands;
    }

    /**
     * 绘制验证码字符到图片上
     * @param g 图形绘制对象
     * @param rands 验证码字符数组
     */
    private static void drawRands(Graphics g, char[] rands) {
        // 设置字体样式
        g.setFont(new Font("Console", Font.BOLD, FONT_SIZE));

        // 逐个绘制验证码字符
        for (int i = 0; i < rands.length; i++) {
            // 设置随机颜色
            g.setColor(getRandomColor());
            // 绘制字符到指定位置
            g.drawString("" + rands[i], i * FONT_SIZE + 10, 22);
        }
    }

    /**
     * 绘制图片背景和干扰元素
     * @param g 图形绘制对象
     */
    private static void drawBackground(Graphics g) {
        // 设置背景为白色
        g.setColor(Color.white);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        // 绘制验证码干扰点
        for (int i = 0; i < 200; i++) {
            int x = (int) (Math.random() * WIDTH);
            int y = (int) (Math.random() * HEIGHT);
            g.setColor(getRandomColor());
            g.drawOval(x, y, 1, 1);
        }
    }

    /**
     * 获取随机颜色
     * @return 随机生成的颜色对象
     */
    private static Color getRandomColor() {
        Random ran = new Random();
        // 生成RGB颜色值（限制在220以内避免颜色过亮影响验证码识别）
        return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220));
    }
}
